DUA3:<000000>PASCAL034.RELEASE_NOTES;2














                              CHAPTER 1

                              CHAPTER 1

                    VAX PASCAL V3.4 RELEASE NOTES

                    VAX PASCAL V3.4 RELEASE NOTES




This file contains  information  about  the  differences  between  VAX
PASCAL  Version  3.4  and previous versions of VAX PASCAL, including a
short description of the new features.

This file is organized into 4 chapters.

Chapter 1 provides an overview of this file.

Chapter  2  provides   information   on   compatibility,   performance
improvements, restrictions, and documentation errors.

Chapter 3 provides information on changes made to  existing  features,
new features, compiler performance improvements, and validation.

Chapter 4 provides a list of the maintenance fixes included in the VAX
PASCAL V3.4 compiler.






















                                 1-1












                                 CHAPTER 2

                                 CHAPTER 2

                            COMPATIBILITY NOTES

                            COMPATIBILITY NOTES




   This chapter describes the compatibility between VAX PASCAL Version  3
   and  Version 3.4.  It gives a description of source, object, and image
   compatibility, ways to improve performance, a  possible  failure  when
   the   %DICTIONARY   directive   is   used,   known  restrictions,  and
   documentation errors.



   2.1  COMPATIBILITY

   2.1  COMPATIBILITY

   This section describes the compatibility between VAX PASCAL Version  3
   and the new Version 3.4.



   2.1.1  Source Compatibility

   2.1.1  Source Compatibility

   The source language accepted by the VAX PASCAL Version 3.4 compiler is
   upwardly  compatible with that accepted by the Version 3 compiler with
   the following exceptions:

        o  The following informational message is  issued  when  using  a
           match  type  parameter  keyword  of  GEQ  or  GTR  in  a FINDK
           procedure call.

                RECMATCHTYP, MATCH_TYPE identifier "NXT or NXTEQL" is
                recommended instead of "GTR or GEQ"

           See Chapter 3 of this guide for more information on the  FINDK
           procedure.

        o  The following warning message is issued when calling  the  PAD
           function as a procedure.

                CALLFUNC, Function PAD called as procedure, function
                value discarded


                                    2-1












   COMPATIBILITY NOTES

   COMPATIBILITY NOTES
   Compatibility

   Compatibility


        o  An UNBOUND routine cannot be used to  call  a  BOUND  routine.
           Previously,  when  calling  a  bound  routine  from an unbound
           routine and compiling  with  /OPTIMIZE,  the  expected  syntax
           error  flagging  an  illegal  uplevel  call  was  not  issued.
           Compiling with /NOOPTIMIZE resulted in the appropriate error.

           This has been corrected  so  that  the  syntax  error  is  now
           received when compiling with either /OPTIMIZE or /NOOPTIMIZE.



   2.1.2  Object Compatibility

   2.1.2  Object Compatibility

   The object files produced by the VAX PASCAL Version 3.4  compiler  are
   upwardly  compatible  with  the  Version  3 object files.  They can be
   mixed freely in the same executable image.



   2.1.3  Image Compatibility

   2.1.3  Image Compatibility

   The images linked with VAX PASCAL V3.4  object  modules  are  strictly
   compatible with similar images using V3 modules.



   2.1.4  Environment Files

   2.1.4  Environment Files

   The environment files produced by a VAX PASCAL Version 3 compiler will
   be  accepted  by  the  VAX  PASCAL  Version  3.4  compiler.   However,
   environment files produced by the VAX PASCAL Version 3.4 compiler will
   not be accepted by an earlier Version 3 compiler.

   Although no warning message will be issued, it is recommended that all
   environment  modules  be  recompiled  with  the VAX PASCAL Version 3.4
   compiler.




   2.1.5  Behavior Differences

   2.1.5  Behavior Differences

   There are several differences in behavior that you  will  notice  when
   migrating  from  a VAX PASCAL Version 3 compiler to VAX PASCAL Version
   3.4:


        o  Size and UNSAFE  attribute  behavior  --  Previously,  when  a
           variable  was  declared  with  both  a  size attribute and the
           UNSAFE attribute, different behavior was received depending on
           the variable's data type.


                                    2-2





















                                                      COMPATIBILITY NOTES

                                                      COMPATIBILITY NOTES
                                                            Compatibility

                                                            Compatibility


           To provide consistency among  variable  types,  the  behaviors
           were modified and is described below:

           -  Assignment  to  variables  with  a   size   attribute   are
              zero-extended (if necessary) and all bits are written.

           -  Fetching from variables with a  size  attribute  need  only
              reference sufficient bits to access the legal values of the
              type.  The contents of a variable are undefined if it  does
              not  contain  a  zero-extended  legal value of the variable
              type.

           -  Assignment to a variable with the UNSAFE  attribute  causes
              the  value  of  the  right-hand  side  to  be  truncated or
              zero-extended to the bit size of  the  left-hand  variable.
              Note  this may not always be its natural bit size.  If that
              value is a legal value of  the  left-hand  type,  then  the
              assignment occurs; otherwise, the variable is undefined.

           -  The UNSAFE attribute has no effect on variable fetches.

           For example consider a variable "v" declared as "[LONG,UNSAFE]
           (aa,bb,cc)."  As an enumeration of less than 256 elements, its
           natural size is one byte (8 bits).  But because  of  the  LONG
           size  attribute,  it  is  allocated  a  longword  (32 bits) in
           memory.  However, all  fetches  from  the  variable  are  BYTE
           fetches,  because the explicit size attribute has no effect on
           any fetches.

           Assignments will correctly assign the lowest byte of "v",  but
           the  contents  of  the  extra bits are zero-extended after the
           assignment.


        o  Unpacked array alignment behavior -- Previously, the  compiler
           did  not  enforce  the  rule  that  all components of unpacked
           arrays are byte aligned by default.

           This  behavior  has  been  changed  to  correct  this  and  is
           described below:

           -  All components of unpacked arrays are now byte  aligned  by
              default.  For example consider the following program:

                   PROGRAM  PRINT_HEX(OUTPUT);

                   VAR I : ARRAY [1..10] OF [BIT] BOOLEAN;
                       J : INTEGER;

                   BEGIN
                     I := ZERO;


                                    2-3





















   COMPATIBILITY NOTES

   COMPATIBILITY NOTES
   Compatibility

   Compatibility


                     FOR J :=1 TO 10 DO
                       I[J] := TRUE;
                     WRITELN(HEX(I));
                   END;

              The Version 3 compiler would have generated  the  following
              output:

                   000000000000000003FF

              The program will now generate the following correct output:

                   01010101010101010101           


        o  OPTIMIZE(INLINE) attribute behavior  --  The  OPTIMIZE(INLINE)
           attribute  enables  inline expansion of user-defined routines.
           Previously, when a routine  declaration  explicitly  contained
           this  attribute, the compiler treated it as the default.  That
           is, the compiler tested the routine for "hard" failures,  such
           as an EXTERNAL routine, having a routine parameter, containing
           local file variables.  It then ran the "soft" tests to  decide
           whether  or  not  to  expand the routine.  These tests include
           testing the size of the routine, number  of  local  variables,
           number  of  parameters,  and  number  of calls to the routine.
           This behavior has been changed and is described below:

           -  If an explicit OPTIMIZE(INLINE)  attribute  exists  on  the
              routine  declaration,  the  compiler will still perform the
              "hard" failure tests; however, the "soft" tests will not be
              performed.   This  gives  the  user  more power in deciding
              which routines should be inlined.

        o  HIDDEN attribute behavior --  The  HIDDEN  attribute  prevents
           information  concerning  a  type  definition  or  a  variable,
           procedure or function declaration from being  included  in  an
           environment  file.   Previously,  if  a  type  definition  was
           declared with the HIDDEN attribute and a variable was declared
           to  be  of  the hidden type, the variable was considered to be
           HIDDEN too.  For example:

                        TYPE  X = [HIDDEN] INTEGER;
                        VAR   Y : X;

           The Version 3 compiler did not include information about X and
           Y in the generated environment file.

           This behavior has been changed and is described below:

           -  When a variable is declared to be of  a  HIDDEN  type,  the
              HIDDEN attribute is not passed through to the variable.  In


                                    2-4





















                                                      COMPATIBILITY NOTES

                                                      COMPATIBILITY NOTES
                                                            Compatibility

                                                            Compatibility


              the example above, information about X would not be  passed
              to  the generated environment file, but information about Y
              would.  If you want to hide Y, you must specify  HIDDEN  on
              the variable declaration.


        o  OVERLAID attribute behavior - The  OVERLAID  attribute  causes
           all  outer level variables that don't have explicit allocation
           attributes to be placed  in  the  overlaid  PAS$GLOBAL  psect.
           Contrary  to the documentation, the compiler previously placed
           variables with the STATIC attribute into the PAS$GLOBAL  psect
           regardless of their nesting level.

           This behavior has been changed and is described below:

           -  The  OVERLAID  attribute  now  only  places   outer   level
              variables  that  do not have explicit allocation attributes
              into the PAS$GLOBAL psect.  For example:

                           [OVERLAID]
                           MODULE OVERLAID_TEST;

                           VAR
                               I : INTEGER;
                               J : [STATIC] INTEGER;

                               PROCEDURE OVERLAID_PROCEDURE;
                               VAR
                                   K : [STATIC] INTEGER;
                                   BEGIN
                                   END;
                           END.

              The V3 compiler would have placed I,  J,  and  K  into  the
              PAS$GLOBAL psect.

              The V3.4 compiler will  now  correctly  place  I  into  the
              PAS$GLOBAL  psect  and J and K into the non-overlaid $LOCAL
              psect.

              If you want these variables to  remain  in  the  PAS$GLOBAL
              psect,  you must now explicitly specify this with the PSECT
              attribute.



   2.1.6  STARLET.PAS

   2.1.6  STARLET.PAS

   The STARLET files are built using  a  library  of  intermediate  files
   supplied  and  maintained by VMS (SYS$LIBRARY:STARLETSD.TLB).  If this
   library is updated during a VMS upgrade,  you  should  re-install  the


                                    2-5





















   COMPATIBILITY NOTES

   COMPATIBILITY NOTES
   Compatibility

   Compatibility


   STARLET  saveset  to include any modifications that may have been made
   by VMS.

   Previously, the STARLET.PAS  and  STARLET.PEN  installation  procedure
   replaced  all  occurrences  of  DEF  in  a record type definition with
   $TYPE.  For example, FABDEF was changed to FAB$TYPE.  This resulted in
   unique names being generated.

   In recent VMS versions, several names were added in STARLET  which  do
   not  contain  DEF.   For  these  definitions, the record name was just
   passed through without any modifications.  Inheriting STARLET.PEN with
   these  unchanged  names  could  potentially result in the compile-time
   redeclaration error if  an  existing  program  already  coincidentally
   contained a variable of the same name.

   For this reason, it was decided that if a variable definition did  not
   contain a DEF, the STARLET installation procedure will append $TYPE to
   the record name.  The following list enumerates the record types  with
   names  that have been changed to include $TYPE.  If a program uses any
   of these STARLET definitions, it must  be  changed  to  include  $TYPE
   also.

        o  LBRCTLTBL

        o  CQUALS

        o  LIB$B_DCF_OPERAND

        o  FLAGS_INPUT

        o  PRIVS_USED_BITS

        o  FLAG_BITS

        o  NAMSPACE

        o  STATEF

        o  SYSUAFF_BITS

        o  N_RXCS_REGISTER

        o  N_RXDB_REGISTER

        o  N_TXCS_REGISTER

        o  N_TXDB_REGISTER

        o  CSM_UNSOLICITED_DATA




                                    2-6





















                                                      COMPATIBILITY NOTES

                                                      COMPATIBILITY NOTES
                                                            Compatibility

                                                            Compatibility


        o  FILE_FLAGS

        o  FILE_STATUS

        o  FORM_FLAGS

        o  JOB_FLAGS

        o  JOB_STATUS

        o  QUEUE_FLAGS

        o  QUEUE_STATUS

        o  SEARCH_FLAGS

        o  ACCOUNTING_TYPE

        o  FLDFLAGS



   2.2  IMPROVING PERFORMANCE

   2.2  IMPROVING PERFORMANCE

   To improve performance, especially if you are a frequent user  of  VAX
   PASCAL  Version  3.4,  you  may want to install the software using the
   VAX/VMS  Install  Utility  (INSTALL).    You   should   install   both
   SYS$SYSTEM:PASCAL.EXE  and  SYS$SHARE:PASRTL.EXE  as open, shared, and
   header-resident.  More information on how to install these  images  is
   provided  in  Chapter  1  of  this  manual.   The  Install  Utility is
                            _______ _______ _______ _________ ______

   described in full in the VAX/VMS Install Utility Reference Manual.



   2.3  POSSIBLE FAILURE OF THE %DICTIONARY DIRECTIVE

   2.3  POSSIBLE FAILURE OF THE %DICTIONARY DIRECTIVE

   The compilation of a routine containing a  %DICTIONARY  directive  may
   fail with multiple errors of the form:

        %LIB-E-ACTIMAGE, error activating image sys$library:CDDSHR.EXE;5
        -SYSTEM-F-PROINSTALL, protected images must be installed

   If the routine terminates prematurely with an  access  violation,  the
   problem  may  be due to an unsuccessful installation of the VAX Common
   Data Dictionary.  You must rerun the  product  installation  procedure
   for the VAX Common Data Dictionary.  You must also make the CDDSHR.EXE
   shareable image a known  image  with  the  following  VAX/VMS  Install
   Utility command:

                   ___

        $ INSTALL> ADD
        __________________________________________________________

        SYS$SHARE:CDDSHR.EXE/SHARED/OPEN/HEADER_RESIDENT/PROTECTED


                                    2-7





















   COMPATIBILITY NOTES

   COMPATIBILITY NOTES
   Known Restrictions

   Known Restrictions


   2.4  KNOWN RESTRICTIONS

   2.4  KNOWN RESTRICTIONS

   This section includes all known restrictions in the VAX PASCAL Version
   3.4 compiler.




   2.4.1  Blank Padding of PACKED ARRAY OF CHAR Value Parameters

   2.4.1  Blank Padding of PACKED ARRAY OF CHAR Value Parameters

   The string parameter must be structurally compatible with  the  formal
   parameter.   The VAX PASCAL compiler will not blank pad a fixed length
   character  string  expression  with  blanks  to   match   the   formal
   declaration.   For example, the following program segment will produce
   a compile-time error:

        TYPE STR40 = PACKED ARRAY [1..40] OF CHAR;

        PROCEDURE PASS_STR40( P : STR40 );
                BEGIN ... END;

            BEGIN
        STR40( 'Shorter than 40 chars' );
        END.



   2.4.2  String Expressions as Actual Value Parameters

   2.4.2  String Expressions as Actual Value Parameters

   If several formal value parameters are declared in  the  same  section
   and  have  the  same conformant packed array schema, all corresponding
   actual parameters must have the same bounds at run time.  For example:

        PROCEDURE P (A, B : PACKED ARRAY [L..U : INTEGER] OF CHAR);

   In a call to P, the actual parameters passed to  A  and  B  must  have
   identical  string  bounds.  However, due to an error in the VAX PASCAL
   Version 3.4 compiler, the bounds of these parameters are not  checked.
   If a program calls P with two character-string parameters of different
   lengths, an error will not be signaled and the bound identifiers L and
   U will not correctly describe the bounds of the formal parameter B.

   Note that this restriction applies only to string  expressions  passed
   to  value  conformant  PACKED ARRAY OF CHAR parameters.  For all other
   types of parameters, bounds checking is done during compile time.



   2.4.3  Passing File Buffer Variables

   2.4.3  Passing File Buffer Variables




                                    2-8





















                                                      COMPATIBILITY NOTES

                                                      COMPATIBILITY NOTES
                                                       Known Restrictions

                                                       Known Restrictions


   When the buffer variable of a file is passed as a VAR  parameter,  the
   allocation  size  of  the  formal VAR parameter must match that of the
   components of the file.  Failure to do so causes an internal  compiler
   error.  The following program demonstrates this:

        PROGRAM A;
        VAR
            F : PACKED FILE OF 0..65535;
            G : FILE OF [WORD] 0..65535;

        PROCEDURE P (VAR I : INTEGER); EXTERNAL;

        BEGIN
        P(F^); { causes internal compiler error }
        P(G^); { causes internal compiler error }
        END.

   A file buffer variable must be passed only to a formal  VAR  parameter
   with an allocation size that matches that of the file's components.



   2.5  DOCUMENTATION ERRORS

   2.5  DOCUMENTATION ERRORS

                                                           ___________ __

   This section includes all known documentation errors in Programming in
   ___ ______         ___ ______ ______ _____

   VAX PASCAL and the VAX PASCAL User's Guide.



   2.5.1  LIST Attribute

   2.5.1  LIST Attribute

   The discussion of the LIST attribute fails to mention  that  the  LIST
   attribute  may  not be used on conformant parameters or on function or
   procedure parameters of PASCAL routines.  However, it may be used  for
                                                ___________ __ ___ ______

   such  parameters  on external routines.  See Programming in VAX PASCAL
   page 14-18 for more information on the LIST attribute.



   2.5.2  VARYING OF CHAR Constructor

   2.5.2  VARYING OF CHAR Constructor

   The VARYING OF CHAR constructor does  not  use  the  same  constructor
   syntax  as  the  fixed-length character string.  The constructor for a
   VARYING OF CHAR is a single character string, and cannot be a list  of
   single  character  constants  like  the fixed-length character string.
       ___________ __ ___ ______

   See Programming in VAX PASCAL page 6-8 for  more  information  on  the
   VARYING OF CHAR constructor.






                                    2-9





















   COMPATIBILITY NOTES

   COMPATIBILITY NOTES
   Documentation Errors

   Documentation Errors


   2.5.3  REFERENCE Attribute Example

   2.5.3  REFERENCE Attribute Example

                      ___ ______ ______ _____

   The example in the VAX PASCAL User's Guide  page  3-12  is  incorrect.
   The  semantic  meaning  of  the REFERENCE attribute is the same as the
   %REF foreign mechanism specifier, but the syntax is not the same.  The
   REFERENCE   attribute   comes   after   the  colon  in  the  parameter
   declaration, just like any other  attribute.   Here  are  the  correct
   defintions  for  the  FIND_DETERMINANT  procedure  using both the %REF
   specifier and the REFERENCE attribute.

        PROCEDURE Find_Determinant( %REF Det : Matrix;
                                    VAR Inv : Matrix);

        or

        PROCEDURE Find_Determinant( Det : [REFERENCE] Matrix;
                                    VAR Inv : Matrix);



   2.5.4  Updating Components Example

   2.5.4  Updating Components Example

                      ___ ______ ______ _____

   The example in the VAX PASCAL User's Guide  page  4-29  is  incorrect.
   When  updating existing components of an indexed file, you must modify
   the file variable's buffer, not the file's component record type.

   The following example gives the correct statements  for  updating  the
   component  containing  Order_Num  903,  so that the name field becomes
   'Tom Smith':

        FINDK (Order_File,0,903,EQL);
        Order_File^.Name := 'Tom Smith';
        Update (Order_File);



   2.5.5  STDERRPARM Error Message

   2.5.5  STDERRPARM Error Message

   The following error message should be added to the listing in Appendix
            ___ ______ ______ _____

   A of the VAX PASCAL User's Guide.

   STDERRPARM Nonstandard:  error-recovery parameter.

        Information.

        Information.  The  program  used  the  ERROR  :=  error  recovery
        mechanism on a built-in file manipulation routine.








                                    2-10












                                 CHAPTER 3

                                 CHAPTER 3

                         NEW AND ENHANCED FEATURES

                         NEW AND ENHANCED FEATURES




   The following sections describe the  new  and  enhanced  features  for
   Version 3.4 of VAX PASCAL.



   3.1  QUALIFIERS

   3.1  QUALIFIERS

   The /SHOW qualifier and the /STANDARD qualifier  have  been  enhanced.
   The  /TERMINAL  qualifier  and  the /USAGE qualifier are new features.
   The following sections give a description of  these  enhancements  and
   additions.



   3.1.1  /SHOW

   3.1.1  /SHOW

   The /SHOW qualifier specifies a list of items to be  included  in  the
   listing   file.    It   has   been  enhanced  to  allow  for  the  new
   TABLE_OF_CONTENTS option.

   A single identifier or a list of identifiers enclosed  in  parentheses
   may  follow  /SHOW;  these  identifiers  are  options  that inform the
   compiler which type of information it should generate.  The  following
   table  lists  the  new  TABLE_OF_CONTENTS  option,  its  corresponding
                                  ___________ __ ___  ______

   action, and its negation.  See Programming in VAX  PASCAL  page  3-14,
   for more information on the /SHOW qualifier.

        Option            Action            Negation

        Option            Action            Negation

        TABLE_OF_CONTENTS Enables listing   NOTABLE_OF_CONTENTS
                          of a table of
                          contents if %TITLE
                          or %SUBTITLE was used





                                    3-1






   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Qualifiers

   Qualifiers


   The compiler ignores the /SHOW qualifier if the /LIST qualifier is not
   enabled.   The  default  for the /SHOW qualifier is /SHOW=(DICTIONARY,
   HEADER,INCLUDE,NOINLINE,SOURCE,STATISTICS,TABLE_OF_CONTENTS).     Note
   that,  the  TABLE_OF_CONTENTS  option  is enabled by default, but only
   affects the listing when either the new %TITLE directive  or  the  new
   %SUBTITLE directive has been used within the compilation unit.



   3.1.2  /STANDARD

   3.1.2  /STANDARD

   The   /STANDARD   qualifier   tells   the   compiler    to    generate
   information-level   messages   wherever   the  compilation  unit  uses
   nonstandard PASCAL features.  It has been enhanced to allow for a  new
   VALIDATION  option.   Standard features fall under either the ISO (ISO
   7185-1983(E)) or ANSI (IEEE770X3.97-1983 American  National  Standards
   Institute, Inc.) standards.  For the purposes of this chapter, the ISO
   and ANSI standards are referred to as the PASCAL "standard."

   The following table lists the available options,  their  corresponding
   actions, and their negations.


        Option            Action            Negation

        Option            Action            Negation

        NONE              Disable standards  N.A.
                          checking

        ANSI              Use the rules of   N.A.
                          the ANSI standard

        ISO               Use the rules of   N.A.
                          the ISO standard

        VALIDATION        Perform validation NOVALIDATION
                          for the given
                          standard

   Note that, the /STANDARD qualifier allows only two options to be used.
   The  first  option  selects the standard to be used, ANSI or ISO.  The
   second option determines whether the "strict" validation rules are  to
   be           enforced,           [NO]VALIDATION.            Therefore,
   /STANDARD=(ANSI,ISO,VALIDATION) is not allowed because both  ANSI  and
   ISO are specified.

   By default, these information-level messages are written to the  error
   file  SYS$ERROR.   (Nonstandard  features  are the language extensions
                                    ___________ __ ___  ______

   incorporated in VAX PASCAL.  See Programming in VAX  PASCAL,  Appendix
   D,  Summary of VAX PASCAL Extensions, and Appendix F, Error Detection,
   for a list of all extensions.) Note that, using the VALIDATION  option
   changes  all  nonstandard information-level messages to be error-level


                                    3-2





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                                               Qualifiers

                                                               Qualifiers


   messages.

   The default is /NOSTANDARD.  The /STANDARD qualifier  without  options
   is  equivalent to /STANDARD=(ANSI,NOVALIDATION).  /STANDARD=VALIDATION
   is   equivalent   to   /STANDARD=(ANSI,VALIDATION).    The    negation
   /NOSTANDARD is equivalent to /STANDARD=NONE.



   3.1.3  /TERMINAL

   3.1.3  /TERMINAL

   The /TERMINAL qualifier specifies a list of items to be  displayed  on
   the  terminal.   A  description of the new /TERMINAL qualifier and its
   options are given below.

   A single identifier or a list of identifiers enclosed  in  parenthesis
   may follow the /TERMINAL qualifier; these identifiers are options that
   inform the  compiler  which  type  of  information  to  display.   The
   following  table  lists  the  available  options,  their corresponding
   actions, and their negations.

        Option            Action            Negation

        Option            Action            Negation

        ALL               Enable displaying  NONE
                          of all options

        FILE_NAME         Enable displaying NOFILE_NAME
                          of file names on
                          PASCAL command line

        ROUTINE_NAME      Enable displaying NOROUTINE_NAME
                          of routine names
                          as code is generated

        STATISTICS        Enable displaying NOSTATISTICS
                          of compiler
                          statistics

   By default, /NOTERMINAL is enabled.  The /TERMINAL  qualifier  without
   options  is  equivalent to /TERMINAL=ALL.  The negation /NOTERMINAL is
   equivalent to /TERMINAL=NONE.



   3.1.4  /USAGE

   3.1.4  /USAGE

   The /USAGE qualifier directs  the  compiler  to  perform  compile-time
   checks  indicated  by  the  chosen  options.  A description of the new
   /USAGE qualifier and its options are given below.




                                    3-3





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Qualifiers

   Qualifiers


   A single identifier or a list of identifiers enclosed  in  parentheses
   may  follow  /USAGE;  these  identifiers  are  options  that  tell the
   compiler which checks to  perform.   The  following  table  lists  the
   available options, their corresponding actions, and their negations.

        Option            Action            Negation

        Option            Action            Negation

        ALL               Enable checking    NONE
                          of all options

        UNCERTAIN         Checks for        NOUNCERTAIN
                          variables that
                          may be uninitialized
                          depending on program
                          flow

        UNINITIALIZED     Checks for        NOUNINITIALIZED
                          variables that
                          are known to be
                          uninitialized

        UNUSED            Checks for         NOUNUSED
                          variables that
                          are declared but
                          never referenced

   The following types of variables are not checked for uninitialization:

        o  Variables which have a file component

        o  Predeclared INPUT or OUTPUT

        o  Variables that have global, external or inherited visibility

        o  Variables declared with the AT attribute

        o  Variables declared with the COMMON attribute

        o  Variables declared with the READONLY attribute

        o  Variables declared with the VOLATILE attribute

        o  Variables used as parameters

        o  Variables used as function identifiers

   By default, /USAGE=(NOUNCERTAIN,UNINITIALIZED,UNUSED) is enabled.  The
   /USAGE  qualifier  without  options  is equivalent to /USAGE=ALL.  The
   negation /NOUSAGE is equivalent to /USAGE=NONE.




                                    3-4





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                          %TITLE and %SUBTITLE Directives

                                          %TITLE and %SUBTITLE Directives


   3.2  %TITLE AND %SUBTITLE DIRECTIVES

   3.2  %TITLE AND %SUBTITLE DIRECTIVES

   The  %TITLE  and  %SUBTITLE  directives  allow  specification  of   an
   arbitrary  compile-time  string  for  the  listing  title and subtitle
   lines.  The format is as follows:

        %TITLE 'character string'
        %SUBTITLE 'character string'

   The compiler header has  been  enhanced  to  include  the  %TITLE  and
   %SUBTITLE  strings  in  the  title  and  subtitle  sections.   If  the
   character string is too long  to  fit  in  the  predefined  title  and
   subtitle  sections,  the string will be truncated on the right without
   warning.

   If a %TITLE directive appears on the first line of a page, it sets the
   title  area for the current page and any following pages until another
   %TITLE directive is issued.  If the %TITLE directive does  not  appear
   on  the first line of a page, then the title area is not set until the
   next page and remains active until another %TITLE directive is issued.
   If a %TITLE directive is not active, the field is filled with blanks.

   The %SUBTITLE directive is similiar with the exception  that  it  only
   affects  the  subtitle  area  in  the  source  listing  section.  If a
   %SUBTITLE directive appears on the first or second  line  of  a  page,
   then  the subtitle area is set for the current page.  If the %SUBTITLE
   directive does not appear in the first two lines of a page,  then  the
   subtitle  area  is  not  set  until  the  next  page.   If a %SUBTITLE
   directive is not active, the field is filled  with  "source  listing".
   The subtitle area for the other listing sections remains the same.

   In addition, if either of these directives is used, and a  listing  is
   being generated, a table of contents page is generated by default.  It
   appears first in the listing, preceding the  source  listing  section.
   In  order  to  disable  the table of contents option, you must use the
   /SHOW=NOTABLE_OF_CONTENTS qualifier.  See Section 3.1.1 of this  guide
   for more information on the TABLE_OF_CONTENTS option.



   3.3  SUBRANGES IN VARIANT RECORD LABEL LISTS

   3.3  SUBRANGES IN VARIANT RECORD LABEL LISTS

   Support for subranges in the case label list of  variant  records  has
   been  added  to  allow  you to specify a range of constant values when
   writing the label list.  For example:

        VAR
         Rec = RECORD
           CASE I : INTEGER OF
                0 : (C : CHAR);
            1..10 : (B : BOOLEAN);


                                    3-5





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Subranges in Variant Record Label Lists

   Subranges in Variant Record Label Lists


          OTHERWISE (D : REAL);
          END;



   3.4  SUBRANGES IN CASE STATEMENT LABEL LISTS

   3.4  SUBRANGES IN CASE STATEMENT LABEL LISTS

   Support for subranges in the case label list of the CASE statement has
   been  added  to  allow  you to specify a range of constant values when
   writing the label list.  For example:

        CASE CH OF
          ' '       : WRITELN('Found a space');
          '0'..'9'  : WRITELN('Found a digit');
          'A'..'Z'  : WRITELN('Found a capital letter);
          OTHERWISE   WRITELN('Illegal character');
        END;




   3.5  FINDK PROCEDURE MATCH TYPES

   3.5  FINDK PROCEDURE MATCH TYPES

   The FINDK procedure searches a file index opened for keyed access  and
   locates a specific component.  For example:

        FINDK( file-variable, key-number, key-value [[, match-type]]
            [[, ERROR := error-recovery]] )

   The match type parameter indicates the relationship  between  the  key
   value  in  the  FINDK procedure call and the key value of a component.
   Previously, the match type must have been one of the identifiers  EQL,
   GTR, or GEQ, to indicate that the key to be found has a value equal to
   (=), greater than (>), or greater than or equal to (>=) the key  value
   in the FINDK procedure call.

   With the addition of descending key support in VAX/VMS Version 4.4, it
   is  possible  to  create  an  indexed file with a descending collating
   sequence by using a  USER_ACTION  routine  or  the  EDIT/FDL  command.
   However,  the  match  type  keywords  GTR  and  GEQ were thought to be
   misleading.  The GEQ and GTR keywords do  not  mean  greater  than  or
   equal to (>=) and greater than (>) when used on a descending key.

   For this reason, the recommended match type values NXT and NXTEQL have
   been  added  in VAX PASCAL Version 3.4 to indicate the key to be found
   was either the next key in the collating sequence after the key  value
   or  the  next  or  equal  key  in the collating sequence after the key
   value.





                                    3-6





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                              FINDK Procedure Match Types

                                              FINDK Procedure Match Types


   So if FINDK were used on an  ascending  collating  sequence,  NXT  and
   NXTEQL  would  be  equivalent  to  GTR  and  GEQ.  And if a descending
   collating sequence was used, it would be the same as having a LSS or a
   LEQ.   In  addition,  an  informational  message  is  generated when a
   program uses the GTR or GEQ match type, advising the user to  use  the
   suggested NXT or NXTEQL match type instead.

   The match type is optional; if omitted, it defaults to EQL.



   3.6  TEXT LIBRARIES

   3.6  TEXT LIBRARIES

   The following sections describe text libraries and their usage.



   3.6.1  Using Text Libraries

   3.6.1  Using Text Libraries

   A  text  library  contains  modules  of  source  text  that  you   can
   incorporate  in  a  program by using the enhanced Version 3.4 %INCLUDE
   directive.  Modules within a  text  library  are  like  ordinary  text
   files, except that they contain a unique name, called the module name,
   that is used to access them, and several can be contained  within  the
   same  library file.  Modules in text libraries can contain any kind of
   text; this section discusses  their  use  only  when  PASCAL  language
   source is used.

   To create and modify modules in text libraries, you  use  the  VAX/VMS
   LIBRARY command.  Text libraries have a default file type of TLB.

   To access a source module in  a  text  library,  you  do  one  of  the
   following:

        o  Specify only the name of the module in an  %INCLUDE  directive
           in  your  PASCAL  source  program  and  specify  the name of a
           library using the /LIBRARY qualifier on the PASCAL command; or
           specify  a  default  library  with  the PASCAL$LIBRARY logical
           name.

        o  Specify the name of both the library and module in an %INCLUDE
           directive in your PASCAL source program.



   3.6.2  Using the LIBRARY Commands

   3.6.2  Using the LIBRARY Commands

   The following table summarizes the commands that create libraries  and
   provide   maintenance  functions.   For  a  complete  listing  of  the
   qualifiers for the LIBRARY command and  a  description  of  the  other
   DIGITAL Command Language (DCL) commands listed in the following table,


                                    3-7





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Text Libraries

   Text Libraries


           _____ __ _____ ___ ___ _______ __________ __ _______

   see the Guide to Using DCL and Command Procedures on VAX/VMS.


        Function                 Command Syntax

        Function                 Command Syntax

        Create a library         $ LIBRARY/TEXT/CREATE library-name -
                                  _$ file-spec,...

        Add one or more modules  $ LIBRARY/TEXT/INSERT library-name -
        to a library              _$ file-spec,...

        Replace one or more      $ LIBRARY/TEXT/REPLACE library-name -
        modules in a library      _$ file-spec,...

        Specifiy the names of    $ LIBRARY/TEXT/INSERT library-name -
        modules to be added to a _$ file-spec/MODULE=module-name
        library

        Delete one or more       $ LIBRARY/TEXT/DELETE=(module-name,...)-
        modules from a library    _$ library-name

        Copy a module from a     $ LIBRARY/TEXT/EXTRACT=module-name -
        library into another      _$ /OUTPUT=file-spec library-name
        file

        List the modules in a    $ LIBRARY/TEXT/LIST=file-spec -
        library                   _$ library-name

   The LIBRARY command qualifier /TEXT indicates a text  module  library.
   By  default, the LIBRARY command assumes an object module library.  If
   no other action qualifiers are specified and no module exists with the
   given name, REPLACE is the default function of the LIBRARY command.



   3.6.3  Naming Text Modules

   3.6.3  Naming Text Modules

   The LIBRARY command adds a module to a library.  By default,  it  uses
   the input file name as the name of the module.  For example:

         ___________________ ________ ______________________

        $LIBRARY/TEXT/CREATE PASFILES APPLIC.SYM,DECLARE.PAS

   The contents of the files APPLIC.SYM and DECLARE.PAS are added to  the
   library and the modules APPLIC and DECLARE are named.

   Alternatively, you can name a module in a  library  with  the  /MODULE
   qualifier.  For example:

         ___________________ ________

        $LIBRARY/TEXT/INSERT PASFILES
        ________________________________________

        DECLARE.PAS/MODULE=EXTERNAL_DECLARATIONS



                                    3-8





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                                           Text Libraries

                                                           Text Libraries


   The %INCLUDE command inserts the contents of the file DECLARE.PAS into
   the  library  PASFILES  under  the  name  EXTERNAL_DECLARATIONS.  This
   module can be included in a PASCAL source file during compilation with
   the statement

            %INCLUDE 'PASFILES(EXTERNAL_DECLARATIONS)'



   3.6.4  Specifying Library Files on the PASCAL Command Line

   3.6.4  Specifying Library Files on the PASCAL Command Line

   The /LIBRARY qualifier is used on the PASCAL command line to  identify
   text  libraries.   If  you are compiling a source file that includes a
   module from a text library, you  concatenate  the  name  of  the  text
   library  to  the  name  of  the  source  file  and append the /LIBRARY
   qualifier to the text library name.  Concatenation is specified with a
   plus sign.  For example:

         ______ ___________________

        $PASCAL APPLI+DATAB/LIBRARY

   Whenever an %INCLUDE directive  occurs  in  APPLIC.PAS,  the  compiler
   searches  the  library DATAB.TLB for the source text module identified
   in the %INCLUDE directive and incorporates it into the compilation.

   If you are concatenating source  files,  the  /LIBRARY  qualifier  can
   appear  only  after  the  last  source  file.  For example, this is an
   illegal command:

         ______ _______________________________

        $PASCAL SRC1.PAS+DATAB/LIBRARY+SRC2.PAS

   Instead, you would type
            
         ______ _______________________________

        $PASCAL SRC1.PAS+SRC2.PAS+DATAB/LIBRARY

   In addition, any  PASCAL  output  qualifiers  that  appear  after  the
   /LIBRARY  qualifier,  such as /OBJECT or /LISTING, apply to the latest
   source file name.  For example, the following PASCAL  command  creates
   APPLI.OBJ:

         ______ __________________________

        $PASCAL APPLI+DATAB/LIBRARY/OBJECT



   3.6.5  User-Supplied Default Libraries

   3.6.5  User-Supplied Default Libraries

   You can define one of your private text libraries as a default library
   for  the  PASCAL compiler to search.  The PASCAL compiler searches the
   default library after it searches libraries specified  in  the  PASCAL
   command.




                                    3-9





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Text Libraries

   Text Libraries


   To establish a default library, define an equivalence for the  logical
   name PASCAL$LIBRARY, as in the following example of the VAX/VMS DEFINE
   command:

         ______ ______________ ________________

        $DEFINE PASCAL$LIBRARY DISK$:[LIB]DATAB

   While  this  assignment  is  in  effect,  the  compiler  automatically
   searches the library DISK$:[LIB]DATAB.TLB for any include modules that
   it cannot locate in  libraries  explicitly  specified  on  the  PASCAL
   command.

   You can define the logical name, PASCAL$LIBRARY, in any  logical  name
   table.   Since  the VAX PASCAL compiler uses the VAX Record Management
   System (RMS) to open  the  text  library,  the  order  of  name  table
   searches will be determined by VAX RMS.

   If PASCAL$LIBRARY is defined as a search list, the compiler will  open
   the  first  item  specified in the list.  If the include module is not
   found there, the search is terminated and an error message is issued.



   3.6.6  Search Order of Libraries

   3.6.6  Search Order of Libraries

   If a file specification  is  given  in  the  %INCLUDE  directive,  the
   compiler will use that file spec and ignore any libraries specified on
   the command line with the /LIBRARY qualifier and it  will  ignore  the
   PASCAL$LIBRARY logical name.

   Otherwise, when more  than  one  library  is  specified  on  a  PASCAL
   command,  the  PASCAL  compiler  searches  the  libraries in the order
   specified, on the command line, each time  it  processes  an  %INCLUDE
   directive that specifies a text module name.  For example:

         ______ _____________________________________________________

        $PASCAL APPLIC+DATAB/LIBRARY+NAMES/LIBRARY+GLOBALSYMS/LIBRARY

   When PASCAL  processes  an  %INCLUDE  directive  in  the  source  file
   APPLIC.PAS,  it  searches  the  libraries  DATAB.TLB,  NAMES.TLB,  and
   GLOBALSYMS.TLB, in that order, for source text modules  identified  in
   the %INCLUDE directive.

   On a command that requests multiple compilations, a  library  must  be
   specified for each compilation in which it is needed.  For example:

         ______ _____________________ ___________________

        $PASCAL METRIC+DATAB/LIBRARY, APPLI+DATAB/LIBRARY

   In this example, PASCAL compiles METRIC.PAS and APPLIC.PAS  separately
   and uses the library DATAB.TLB for each compilation.





                                    3-10





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                                           Text Libraries

                                                           Text Libraries


   After the  compiler  has  searched  all  libraries  specified  in  the
   command,  it  searches the user-supplied library, if any, specified by
   the logical name PASCAL$LIBRARY.



   3.6.7  %INCLUDE Directive

   3.6.7  %INCLUDE Directive

   The %INCLUDE directive has been enhanced to allow a  user  to  include
   the  contents  of  a text library module directly into the compilation
   unit.  The %INCLUDE directive for including from a  text  library  has
   the following format:

            %INCLUDE '[file-spec](module-name)[/[NO]LIST]'

        file-spec
             The name of the text  library  containing  a  module  to  be
             included in the compilation

        module-name
             The name of a text module, located in a text  library,  that
             is  to  be  included  in  the  source file.  The name of the
             module must be enclosed in  parentheses.   The  module-names
             can include any printable character except space, horizontal
             tab, comma, or exclamation point.  The maximum length of the
             module-name  is determined when the text library is created.
                                                                  _______

             Module-names are also  case-insensitive.   See  the  VAX/VMS
             _________ _________ ______

             Librarian Reference Manual for more information.

        /[NO]LIST
             The /LIST  qualifier  indicates  that  the  included  module
             should be printed in the listing of the program if a listing
             is being generated.  /LIST is the default.



   3.7  INLINE CODE EXPANSION FOR USER DECLARED ROUTINES

   3.7  INLINE CODE EXPANSION FOR USER DECLARED ROUTINES

   The VAX PASCAL compiler  can  often  replace  calls  to  user-declared
   routines  with  an  inline expansion of the routine's executable code.
   Previously, if the called routine contained local labels  the  routine
   was not able to be inlined.  This restriction has been lifted.



   3.8  ERROR MESSAGES

   3.8  ERROR MESSAGES

   The following sections include an error message with text has has been
   changed and several error messages that have been added.




                                    3-11





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Error Messages

   Error Messages


   3.8.1  Changed Error Messages

   3.8.1  Changed Error Messages

   The following error message text has been changed to:

   IVMATCHTYP, Invalid MATCH_TYPE parameter to FINDK



   3.8.2  New Error Messages

   3.8.2  New Error Messages

   The following error messages have been added  to  VAX  PASCAL  Version
   3.4.

   CALLFUNC, Function "function name" called as procedure, function value
   discarded

        Warning.

        Warning.

   INVCASERNG, Invalid range in case label list

        Error.

        Error.

   INVEVAL, "Array or record" evaluation is not allowed

        Error.

        Error.

   PROCESSRTN, Generating code for "routine name"

        Success.

        Success.

   PROCESSFILE, Compiling file "file name"

        Success.

        Success.

   STDCASLBLRNG, Nonstandard:  label range in case selector

        Information.

        Information.

   STDCMPCOMPAT, Nonstandard:  cannot "PACK or  UNPACK"  array  component
   types are incompatible

        Information.

        Information.

   STDCMPDIR, Nonstandard:  compiler directive

        Information.

        Information.

   STDFLDHIDPTR, Nonstandard:  record field identifer "field name"  hides
   type identifer "field name"

        Information.

        Information.


                                    3-12





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                                           Error Messages

                                                           Error Messages


   STDVALCNFPRM, Nonstandard:  conformant array  may  not  be  passed  to
   value conformant parameter

        Information.

        Information.

   RECMATCHTYP, MATCH_TYPE identifier  "NXT  or  NXTEQL"  is  recommended
   instead of "GTR or GEQ"

        Information.

        Information.

   UNCERTAIN, "symbol name" may not have been initialized

        Warning.

        Warning.  This message flags a variable that may be undefined  at
        the point of the error depending on the flow of the program

   UNINIT, "symbol name" has not been initialized

        Warning.

        Warning.  This message flags a variable that is undefined at  the
        point of the error

   UNREAD, Variable "symbol name" is assigned into, but never read

        Information.

        Information.

   UNUSED, Variable "symbol name" is never referenced

        Information.

        Information.

   UNWRITTEN, Variable "symbol name" is read, but never assigned into

        Warning.

        Warning.



   3.9  COMPILER PERFORMANCE IMPROVEMENTS

   3.9  COMPILER PERFORMANCE IMPROVEMENTS

   This section includes the  performance  improvements  for  VAX  PASCAL
   Version 3.4.



   3.9.1  Lifted Restrictions on Optimizations

   3.9.1  Lifted Restrictions on Optimizations

   The restrictions that have been lifted for various  optimizations  are
   listed below:

        o  Elimination of Common Subexpression --- Version 3 was not able
           to  detect  common  subexpressions across routine calls in all
           circumstances.  This restriction  has  been  lifted  to  allow
           these  optimizations  to  be detected correctly in more cases.
                   ___ ______ ______ _____

           See the VAX PASCAL User's Guide for more  information  on  the


                                    3-13





















   NEW AND ENHANCED FEATURES

   NEW AND ENHANCED FEATURES
   Compiler Performance Improvements

   Compiler Performance Improvements


           elimination of common subexpression.

        o  Inline Code  Expansion  for  User  Declared  Routines  ---  In
           Version  3,  if  the  called routine contained any labels, the
           routine was not able to be inlined.  This restriction has been
                             ___ ______ ______ _____

           lifted.   See the VAX PASCAL User's Guide for more information
           on inline code expansion for user declared routines.



   3.9.2  Smaller Object Files

   3.9.2  Smaller Object Files

   The Version 3 compiler used a  lexical  order  scheme  for  processing
   routines.  In conjunction with inline code expansion for user declared
   routines, this often led  to  producing  more  object  code  than  was
   required.   For  example,  if  a  routine had been inlined at all call
   points,  the  unused  callable  version  of  the  routine  was   still
   generated.

   The order of processing routines  has  been  modified  to  reduce  the
   number of unused routines generated in the object file.



   3.9.3  Better Memory Performance

   3.9.3  Better Memory Performance

   The  algorithms  used  internally   in   the   compiler   for   memory
   allocation/deallocation  have been improved.  In programs that contain
   many routines, this improvement is a significant one.



   3.9.4  Better Environment File Performance

   3.9.4  Better Environment File Performance

   The algorithm used when inheriting an environment file and reading  in
   the  names of the inherited symbols has been improved.  The larger the
   environment file, the more noticeable the improvement.



   3.10  VALIDATION

   3.10  VALIDATION

   VAX PASCAL Version 3.4 also  contains  FIPS-109  (Federal  Information
   Processing  Standard)  validation  support.   Currently, there are two
   Pascal Standards:

        o  ANSI - American National Standard (ANSI/IEEE770X3.97-1983)

        o  ISO - International Standard (ISO 7185-1983(E))




                                    3-14





















                                                NEW AND ENHANCED FEATURES

                                                NEW AND ENHANCED FEATURES
                                                               Validation

                                                               Validation


           The ISO  standard  is  further  divided  into  two  levels  of
           standardization,  Level  0  and  Level  1.  The differences of
           technical substance between the ANSI/IEEE standard and the ISO
           standard include:

           -  ANSI/IEEE does not include conformant arrays.  ISO Level  0
              does not, but ISO Level 1 does.

           -  ANSI/IEEE specifies parameter evaluation  order  for  Read,
              Readln,  Write  and  Writeln.   ISO  does  not address this
              issue.

   VAX  PASCAL  Version  3.4  passed  the  validation  suite  for  Pascal
   compilers.   It  received a CLASS A certificate for both levels of the
   ISO standard, as well as for the ANSI standard.  A CLASS A certificate
   is given to compilers with a fully conforming implementation.





































                                    3-15












                              CHAPTER 4

                              CHAPTER 4

                  VAX PASCAL V3.4 MAINTENANCE FIXES

                  VAX PASCAL V3.4 MAINTENANCE FIXES




This chapter describes all  changes  made  for  the  VAX  PASCAL  V3.4
compiler.   It  summarizes all corrections made as of the date the kit
was built.



      o  An Internal Compiler Error during Context  Analysis  or  Name
         Packing  or  the  generation  of  incorrect code could be the
         result of an IF or CASE statement inside a WHILE loop.   This
         problem has been fixed.


      o  (SPR 11-79613)  An  Internal  Compiler  Error   during   Tree
         Construction  occurred  when a component of an unpacked array
         that was declared with an explicit size attribute was  passed
         to a VAR parameter.  This problem has been fixed.

         The compiler did not enforce the rule that all components  of
         unpacked  arrays  are  byte aligned by default.  The compiler
         will now establish byte alignment as the default for cells of
         unpacked  arrays.  Since the Internal Compiler Error occurred
         only when passing a cell of one of  these  arrays  to  a  VAR
         parameter,  this  change  could  affect  the behavior of some
         programs.  For example:

             PROGRAM PRINT_HEX(OUTPUT);

             VAR I : ARRAY [1..10] OF [BIT] BOOLEAN;
                 J : INTEGER;

             BEGIN
             I := ZERO;
             FOR J := 1 TO 10 DO
                I[J] := TRUE;
             WRITELN(HEX(I));
             END;


                                 4-1






VAX PASCAL V3.4 MAINTENANCE FIXES

VAX PASCAL V3.4 MAINTENANCE FIXES


         This program will generate the following output when compiled
         with older VAX PASCAL compilers.

             000000000000000003FF

         The program will now generate the following correct output.

             01010101010101010101



      o  The  BIT_OFFSET  and  BYTE_OFFSET  builtin   routines   would
         incorrectly  produce syntax errors when uses on a record that
         use a semi-reserved word as a field name.  This  problem  has
         been fixed.


      o  A record with fields declared with the  [READONLY]  attribute
         is  not readonly itself and should not be placed in the $CODE
         psect.  This problem has been fixed.


      o  A CASE statement on an unsigned expression whose labels  span
         the number %X'80000000' could produce an almost infinite loop
         in the compiler when writing out a listing  or  object  file.
         This problem has been fixed.


      o  (SPR 11-79598)  Incorrect code could be generated for certain
         routine  calls,  leading  to  unexpected run-time behavior or
         errors.  The  calls  for  which  this  happened  require  the
         creation  of  a temporary result on the stack for one or more
         of the actual parameters.  This problem has been fixed.


      o  (SPR 11-82626)  The compiler failed to diagnose  the  passing
         of  an  array to a conformant array as an error when the size
         or  alignment  attributes  of  the  actual   parameter   were
         incompatible  with  those  of  the  formal  parameter.   This
         problem has been fixed.

         For example:

            VAR ARR : ARRAY [1..2] OF [ALIGNED(3),WORD] 0..65535;

            PROCEDURE P( A : ARRAY [L..U:INTEGER] OF INTEGER );
               EXTERNAL;

            P(ARR);  { This should get an error }





                                 4-2





















                                     VAX PASCAL V3.4 MAINTENANCE FIXES

                                     VAX PASCAL V3.4 MAINTENANCE FIXES


      o  The compiler failed to diagnose cases where the alignment  of
         array  elements  prevented  aggregrate assignments to another
         array.  This problem has been fixed.

         For example:

            VAR
               A : ARRAY [1..2] OF [ALIGNED(3)] INTEGER;
               B : ARRAY [1..2] OF              INTEGER;

            B := A;  { Should be an error }



      o  An Internal Compiler Error during Context  Analysis  occurred
         when  using  the CHR builtin routine on a literal larger than
         255.  This problem has been fixed.


      o  (SPR 11-85532)  An Internal  Compiler  Error  during  Context
         Analysis   could   occurred   when  a  program  contained  an
         assignment from a converted INTEGER  to  a  PACKED  ARRAY  OF
         CHAR.  This problem has been fixed.

         For example:

            VAR PACKED_ARR : PACKED ARRAY [1..10] OF CHAR;
                I : INTEGER;

            PACKED_ARR := CHR(I);


      o  (SPR 11-86957) An Internal  Compiler  Error  occurred  during
         Source Analysis when compiling a program which uses a default
         value parameter of the null string.  This  problem  has  been
         fixed.    The   appropriate   "operands  are  not  assignment
         compatiable" error message is issued.


      o  An Internal Compiler Error during  Final  would  occur  if  a
         source program was between (3584 + (n * 4096)) and (4032 + (n
         * 4096)) lines in length.  This problem has been fixed.


      o  (SPR 11-86849)  The compiler would occassionally go  into  an
         infinite  loop  when  a  formal  value  or  VAR parameter was
         incorrectly preceded by an attribute list.  This problem  has
         been fixed.


      o  (SPR 11-87269)  Incorrect code was generated when  reading  a
         character  string  into  a conformant varying parameter.  The


                                 4-3





















VAX PASCAL V3.4 MAINTENANCE FIXES

VAX PASCAL V3.4 MAINTENANCE FIXES


         maximum length was always two more than it should have  been.
         This problem has been fixed.


      o  (SPR 11-87628)  A spurious error message was generated by the
         compiler  if  the  default  directory  did  not  exist unless
         /NOENVIRONMENT was specified.  This problem has been fixed.


      o  (SPR 11-88070)  The  compiler  did  not  inherit  environment
         files  across DECnet correctly.  The compiler would sometimes
         generate an Internal Compiler Error during Source Analysis or
         would  corrupt  the  filename  of the environment file.  This
         problem has been fixed.


      o  (SPR 11-87342)  The compiler did not always  place  variables
         in   OVERLAID  compilation  units  into  the  correct  psect.
         Variables declared with the STATIC attribute  at  program  or
         module  level  or  within  procedures  were  allocated in the
         PAS$GLOBAL psect instead of the $LOCAL psect.   This  problem
         has been fixed.

      o  Variables  declared  at  program  or  module  level  to  have
         absolute  allocation  using the AT attribute were incorrectly
         listed in the cross reference output.  This problem has  been
         fixed.


      o  (SPR 11-87485)  The  compiler  would   generate   the   "file
         currently  locked  by  another  user" RMS error when a source
         file was not from a file oriented device  (TT:,  NET:,  MBA:,
         etc)  and  a  fatal  error  occurred  or  the error limit was
         exceeded.  This problem has been fixed.


      o  (SPR 11-86302)  An  Internal  Compiler  Error   during   Name
         Packing,  or  other compile-time errors, or bad code could be
         generated if a function is inline expanded into  the  boolean
         expression  of  an  IF  statement and code inside the inlined
         function is identical to code in the THEN and ELSE  parts  of
         the IF statement.  This problem has been fixed.


      o  (SPR 11-87486)  An  Internal  Compiler  Error   during   Tree
         Building  occurs  when  a  LIST  parameter follows a TRUNCATE
         parameter.  This problem has been fixed.


      o  (SPR 11-88802)  Incorrect code was generated when  a  program
         contained something like the following and optimizations were
         enabled:


                                 4-4





















                                     VAX PASCAL V3.4 MAINTENANCE FIXES

                                     VAX PASCAL V3.4 MAINTENANCE FIXES


                                
             FOR I := 1 TO 2 DO
                CASE B OF
                 1:   ARR[J] := 4;
                 2:   BEGIN
                      ARR[J] := 5;
                      J := J + 1;
                      END;
                 OTHERWISE
                      ARR[J] := 6;
                 END;

         The compiler did not correctly  determine  that  J  had  been
         modified in the second CASE element and incorrectly moved the
         calculation of ARR[J] outside of the FOR loop.  This  problem
         has been fixed.


      o  (SPR 11-88588)  Incorrect debug information was issued when a
         VAR  parameter  of  a  subrange  type or enumerated type that
         contained an explicit size attribute.  This led to unexpected
         results when examining the variable or showing the variable's
         type during a  debugging  session.   This  problem  has  been
         fixed.


      o  (SPR 11-88959)  The compiler would go into an  infinite  loop
         if  within  a nested procedure another procedure was declared
         as FORWARD, then again as EXTERNAL.  This  problem  has  been
         fixed.


      o  The compiler did not obey the 32-bit rule when computing  the
         result  of  the  BITNEXT function.  The compiler occasionally
         returned incorrect results for the  NEXT  function  as  well.
         These problems have been fixed.


      o  (SPR 11-88856)  Incorrect code is  generated  when  compiling
         something like the following and optimizations are enabled:

             REPEAT
                 J := J + 1;
             UNTIL (J MOD 4) = 0;

             REPEAT
                 J := J + 1;
                 K := J + 1;
             UNTIL (J MOD 4) = 0;

         The compiler forgot to perform the first increment  of  J  in
         the second REPEAT loop.  This problem has been fixed.


                                 4-5





















VAX PASCAL V3.4 MAINTENANCE FIXES

VAX PASCAL V3.4 MAINTENANCE FIXES


      o  (SPR 11-88936)  Incorrect code was  generated  for  something
         like the following when compiled with optimizations enabled:

             REPEAT
                 Account := P^.Account;
                 REPEAT
                     WRITELN( P^.Account );
                     P := P^.Next;
                 UNTIL (P = NIL) OR (P^.Account <> Account);
             UNTIL (P = NIL);

         The compiler did not correctly detect that  the  value  of  P
         changed inside the nested REPEAT structure.  This problem has
         been fixed.


      o  The  compiler  would  use  the  incorrect  parameter  passing
         mechanism  when  passing  a  variable  that  had  the [VALUE]
         attribute to a %REF formal parameter.  This problem has  been
         fixed.   The  compiler  now  also  diagnosis  the  error when
         passing a [VALUE] variable to a VAR parameter.


      o  (SPR 11-88867)  Incorrect code was generated if the  compiler
         found  a loop optimization in a FOR loop, then found that the
         loop  could  be  eliminated  because  the  initial-value  and
         final-value  of the loop would always be equal.  The compiler
         failed  to  completely   remove   the   now   unneeded   loop
         optimization.  This problem has been fixed.

























                                 4-6





